//首先，对边进行重定向。对于两个点，我们比较它们的度数大小关系，
//若相等则比较编号大小，从小的点向大的点连边。这样可以得到一张 DAG。
//在新的 DAG 中每次枚举一个点 i，然后将它所有的出边链接的点打上标记 
//再枚举i的一个子节点j,枚举它的所有子节点，若发现有一个子节点k有i的标记，则存在一个三元环 k
//时间复杂 m * 根号m
//给定一个 n个点 ,m条边的简单无向图，求其三元环个数。
#include <bits/stdc++.h>

using namespace std;

typedef pair<int,int> PII;

const int N = 2e5 + 10;

int e[N << 1],ne[N << 1],h[N],idx;
PII Edge[N];
int d[N],vis[N];

void add(int a,int b)
{
    e[idx] = b;
    ne[idx] = h[a];
    h[a] = idx ++;
}

int main()
{
    memset(h, -1 ,sizeof h);
    int n,m;
    cin >> n >> m;
    for(int i = 1; i <= m; i ++)
    {
        int a,b;
        cin >> a >> b;
        d[a] ++;
        d[b] ++;
        Edge[i] = {a,b};
    }
    for(int i = 1; i <= m; i ++)
    {
        int x = Edge[i].first;
        int y = Edge[i].second;
        if(d[x] < d[y]) add(x,y);
        else if(d[x] == d[y] && x < y) add(x,y);
        else add(y,x);
    }
    long long ans = 0;
    for(int i = 1; i <= n; i ++)
    {
        for(int j = h[i]; j != -1; j = ne[j])
        {
            int node = e[j];
            vis[node] = i;//将i点的所有的出边链接的点打上标记i
        }
        for(int j = h[i]; j != -1; j = ne[j])
        {
            int node = e[j];//再枚举i的一个子节点j，枚举它的所有子节点，若发现有一个子节点k有 i的标记，则存在一个三元环 k
            for(int k = h[node]; k != -1; k = ne[k])
            {
                if(vis[e[k]] == i)
                {
                    ans ++;
                }
            }
        }
    }
    cout << ans << endl;
}